package com.company.floorExtract;

import org.jsoup.nodes.Attribute;
import org.jsoup.nodes.Attributes;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


/**
 * Created by v on 17-4-18.
 */
public class FloorExtract {
    //标记元素
    private static int current;
    //我们所认为的楼层树所在
    private static Elements floorTree;

    //面向天涯论坛的楼层提取类
    public static Elements tianYa(Element element){
        return element.getElementsByClass("atl-item");
    }

    //面向豆瓣论坛的楼层提取类
    public static Elements douBan(Element element){
        return element.getElementsByClass("comment-item");
    }

    /**
     * 查找楼层树
     * @param element 一个DomTree下的一个标签
     */
    public static Elements findFloorTree(Element element){
        current=0;
        floorTree =new Elements();
        findFloorTree(element.children(),1);

        return floorTree.clone();
    }
    //递归类
    public static void findFloorTree(Elements elements,int floor){
        if (elements.isEmpty()||floor>10){
            return;
        }

        elements=ignoreTypesettingTag(elements);

        //用哈希单映射的方法，找出最大的
        HashMap<String,Elements> map=new HashMap<>();

        //映射入map中
        Iterator<Element> iterator=elements.iterator();
        while (iterator.hasNext()){
            Element element=iterator.next();

            String str=attributes(element);
            if(!map.containsKey(str)){
                Elements eles=new Elements();
                eles.add(element);
                map.put(str,eles);
            }else {
                map.get(str).add(element);
            }
        }

        //找出map中元素的最大值，然后把最大值写入到静态变量那里
        Iterator<Map.Entry<String,Elements>> ite=map.entrySet().iterator();
        while (ite.hasNext()){
            Map.Entry<String,Elements> entry=ite.next();
            if(entry.getValue().size()>floorTree.size()){
                floorTree=entry.getValue();
            }
        }

        //递归找出其余节点
        for(int i=0;i<elements.size();i++){
            findFloorTree(elements.get(i).children(),floor+1);
        }
    }


    /**
     * 从一个element中提取出String
     * @param element
     * @return 提取出来的String
     */
    public static String attributes(Element element){
        Attributes attributes=element.attributes();
        Iterator<Attribute> iterator=attributes.iterator();

        StringBuffer str=new StringBuffer(attributes.get("class"));

        //把所有的attributes转化为一种String作为匹配
        while (iterator.hasNext()){
            str.append(" "+iterator.next().getKey());
        }

        return str.toString();
    }

    /**
     *忽略掉一些排版上的tag
     * @param elements
     * @return 去除排版格式元素后的elements
     */
    public static Elements ignoreTypesettingTag(Elements elements){
        Elements eles=new Elements();
        Iterator<Element> iterator=elements.iterator();

        while (iterator.hasNext()){
            Element element=iterator.next();
            if(!element.tagName().equals("p")
                    &&!element.tagName().equals("br")
                    &&!element.tagName().equals("strong")){
                eles.add(element);
            }
        }

        return eles;
    }
}
